const { sequelize } = require('../config/database');

async function createTokenTransactionsTable() {
  try {
    await sequelize.query(`
      CREATE TABLE IF NOT EXISTS token_transactions (
        id INT AUTO_INCREMENT PRIMARY KEY,
        user_uuid CHAR(36) NOT NULL COMMENT '用户UUID',
        type ENUM('purchase', 'subscription_grant', 'consumption', 'refund', 'reserve', 'confirm', 'cancel', 'promotional_grant', 'compensation_grant') NOT NULL COMMENT '交易类型：购买、订阅赠送、消费、退款、预扣、确认、取消、活动赠送、补偿发放',
        amount DECIMAL(10,3) NOT NULL COMMENT '代币数量（正数为增加，负数为减少）',
        balance_after DECIMAL(10,3) NOT NULL COMMENT '交易后的余额',
        payment_order_id CHAR(36) DEFAULT NULL COMMENT '关联的支付订单ID',
        description VARCHAR(255) DEFAULT NULL COMMENT '交易描述',
        reserve_id CHAR(36) DEFAULT NULL COMMENT '预扣ID，用于关联预扣、确认、取消操作',
        status ENUM('pending', 'confirmed', 'canceled') NOT NULL DEFAULT 'confirmed' COMMENT '交易状态：待确认、已确认、已取消',
        expires_at DATETIME DEFAULT NULL COMMENT '预扣过期时间',
        related_service VARCHAR(255) DEFAULT NULL COMMENT '关联的业务服务（如：ai_chat, image_generation）',
        request_id VARCHAR(255) DEFAULT NULL COMMENT '请求ID，用于幂等性控制',
        token_source ENUM('purchased', 'promotional', 'compensated') DEFAULT NULL COMMENT '代币来源：购买、活动、补偿（仅用于增加代币的交易）',
        metadata TEXT DEFAULT NULL COMMENT '扩展数据，JSON格式（如：扣除详情、退还信息等）',
        server_type ENUM('text', 'img', 'voice', 'video', 'subscription', 'disposable', 'promotional') DEFAULT NULL COMMENT '服务类型：文本生成、图片生成、声音生成、视频生成、订阅、一次性购买、活动赠送',
        created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
        updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        UNIQUE KEY uniq_reserve_id (reserve_id),
        UNIQUE KEY uniq_request_id (request_id),
        KEY idx_user_uuid_status (user_uuid, status),
        KEY idx_expires_at (expires_at)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代币交易记录表';
    `);
    console.log('token_transactions 表创建成功！');
  } catch (error) {
    console.error('创建 token_transactions 表失败:', error);
    process.exit(1);
  } finally {
    await sequelize.close();
  }
}

if (require.main === module) {
  createTokenTransactionsTable();
} 